/*     */ package com.zimbra.cs.index.analysis;
/*     */ 
/*     */ import com.google.common.base.Strings;
/*     */ import com.zimbra.common.util.Log;
/*     */ import com.zimbra.common.util.ZimbraLog;
/*     */ import java.io.IOException;
/*     */ import java.util.Iterator;
/*     */ import java.util.LinkedList;
/*     */ import java.util.List;
/*     */ import java.util.regex.Matcher;
/*     */ import java.util.regex.Pattern;
/*     */ import org.apache.lucene.analysis.TokenStream;
/*     */ import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
/*     */ import org.apache.lucene.util.NumericUtils;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public final class FieldTokenStream
/*     */   extends TokenStream
/*     */ {
/*     */   private static final int MAX_TOKEN_LEN = 100;
/*     */   private static final int MAX_TOKEN_COUNT = 1000;
/*  48 */   private static final Pattern NUMERIC_VALUE_REGEX = Pattern.compile("-?\\d+");
/*     */   
/*  50 */   private final List<String> tokens = new LinkedList();
/*     */   private Iterator<String> iterator;
/*  52 */   private final CharTermAttribute termAttr = (CharTermAttribute)addAttribute(CharTermAttribute.class);
/*     */   
/*     */   public FieldTokenStream() {}
/*     */   
/*     */   public FieldTokenStream(String name, String value)
/*     */   {
/*  58 */     add(name, value);
/*     */   }
/*     */   
/*     */   public void add(String name, String value) {
/*  62 */     if ((Strings.isNullOrEmpty(name)) || (Strings.isNullOrEmpty(value))) {
/*  63 */       return;
/*     */     }
/*     */     
/*  66 */     name = normalizeName(name);
/*     */     
/*  68 */     if (NUMERIC_VALUE_REGEX.matcher(value).matches()) {
/*     */       try {
/*  70 */         add(name + "#:" + NumericUtils.intToPrefixCoded(Integer.parseInt(value)));
/*     */       }
/*     */       catch (NumberFormatException ignore) {}
/*     */     }
/*     */     
/*  75 */     if (value.equals("*")) {
/*  76 */       add(name + ":*");
/*  77 */       return;
/*     */     }
/*     */     
/*  80 */     StringBuilder word = new StringBuilder();
/*  81 */     for (int i = 0; i < value.length(); i++) {
/*  82 */       char c = value.charAt(i);
/*     */       
/*  84 */       if ((isWhitespace(c)) || ((c == '-') && (word.length() > 0))) {
/*  85 */         if (word.length() > 0) {
/*  86 */           add(name + ':' + word.toString());
/*  87 */           word.setLength(0);
/*     */         }
/*  89 */       } else if (!Character.isISOControl(c)) {
/*  90 */         word.append(Character.toLowerCase(c));
/*     */       }
/*     */     }
/*     */     
/*  94 */     if (word.length() > 0) {
/*  95 */       add(name + ':' + word.toString());
/*     */     }
/*     */   }
/*     */   
/*     */   private void add(String token) {
/* 100 */     if ((token.length() <= 100) && (this.tokens.size() < 1000)) {
/* 101 */       this.tokens.add(token);
/*     */     } else {
/* 103 */       ZimbraLog.index.warn("Unable to index: %.30s", new Object[] { token });
/*     */     }
/*     */   }
/*     */   
/*     */   public boolean incrementToken() throws IOException
/*     */   {
/* 109 */     clearAttributes();
/* 110 */     if (this.iterator == null) {
/* 111 */       this.iterator = this.tokens.iterator();
/*     */     }
/*     */     
/* 114 */     if (this.iterator.hasNext()) {
/* 115 */       this.termAttr.setEmpty().append((String)this.iterator.next());
/* 116 */       return true;
/*     */     }
/* 118 */     return false;
/*     */   }
/*     */   
/*     */ 
/*     */   public void reset()
/*     */   {
/* 124 */     this.iterator = null;
/*     */   }
/*     */   
/*     */   public void close()
/*     */   {
/* 129 */     this.tokens.clear();
/*     */   }
/*     */   
/*     */   private boolean isWhitespace(char ch) {
/* 133 */     switch (ch)
/*     */     {
/*     */     case '\t': 
/*     */     case '\n': 
/*     */     case '\r': 
/*     */     case ' ': 
/*     */     case '"': 
/*     */     case '\'': 
/*     */     case '(': 
/*     */     case ')': 
/*     */     case '*': 
/*     */     case ',': 
/*     */     case ';': 
/*     */     case '<': 
/*     */     case '>': 
/*     */     case '[': 
/*     */     case ']': 
/* 150 */       return true;
/*     */     }
/* 152 */     return false;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private String normalizeName(String name)
/*     */   {
/* 163 */     StringBuilder result = new StringBuilder(name.length());
/* 164 */     for (int i = 0; i < name.length(); i++) {
/* 165 */       char c = name.charAt(i);
/* 166 */       if ((!Character.isISOControl(c)) && (c != ':')) {
/* 167 */         result.append(Character.toLowerCase(c));
/*     */       }
/*     */     }
/* 170 */     return result.toString();
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/index/analysis/FieldTokenStream.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */